//给你一个字符串 s，找到 s 中最长的回文子串。 
//
// 
//
// 示例 1： 
//
// 
//输入：s = "babad"
//输出："bab"
//解释："aba" 同样是符合题意的答案。
// 
//
// 示例 2： 
//
// 
//输入：s = "cbbd"
//输出："bb"
// 
//
// 
//
// 提示： 
//
// 
// 1 <= s.length <= 1000 
// s 仅由数字和英文字母组成 
// 
// Related Topics 字符串 动态规划 👍 5188 👎 0

package leetcode.editor.cn;

class LongestPalindromicSubstring {
    public static void main(String[] args) {
        Solution solution = new LongestPalindromicSubstring().new Solution();
        solution.longestPalindrome("aacabdkacaa");
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        /**
         * 回文子串类型题
         *
         * @param s
         * @return
         */
        /*public String longestPalindrome(String s) {
            if (s.length() == 1) {
                return s;
            }
            boolean[][] dp = new boolean[s.length()][s.length()];
            for (int i = 0; i < s.length(); i++) {
                dp[i][0] = false;
                dp[0][i] = false;
            }
            int result = 0;
            String str = String.valueOf(s.charAt(0));

            for (int i = s.length() - 1; i >= 0; i--) {
                for (int j = i; j < s.length(); j++) {
                    if (s.charAt(i) == s.charAt(j)) {
                        if (j - i <= 1) {
                            dp[i][j] = true;
                            if (j - i > result) {
                                result = j - i;
                                str = s.substring(i, j + 1);
                            }
                        } else if (dp[i + 1][j - 1]) {
                            dp[i][j] = true;
                            if (j - i > result) {
                                result = j - i;
                                str = s.substring(i, j + 1);
                            }
                        }
                    }
                }
            }

            return str;
        }*/

        // 从中间向左右扩散的双指针解法
        /*public String longestPalindrome(String s) {
            String res = "";
            for (int i = 0; i < s.length(); i++) {
                String s1 = palindrome(s, i, i);
                String s2 = palindrome(s, i, i + 1);
                res = res.length() > s1.length() ? res : s1;
                res = res.length() > s2.length() ? res : s2;
            }

            return res;
        }

        // 判断字符串区间开始是否是回文子串
        public String palindrome(String s, int l, int r) {
            while (l >= 0 && r < s.length() && s.charAt(l) == s.charAt(r)) {
                l--;
                r++;
            }

            return s.substring(l + 1, r);
        }*/

        // dp
        public String longestPalindrome(String s) {
            if (s.length() == 1) return s;
            boolean[][] dp = new boolean[s.length()][s.length()];
            for (int i = 0; i < s.length(); i++) {
                dp[i][i] = true;
            }

            String str = String.valueOf(s.charAt(0));
            int result = 0;

            for (int i = s.length() - 1; i >= 0; i--) {
                for (int j = i; j < s.length(); j++) {
                    if (s.charAt(i) == s.charAt(j)) {
                        if (j - i <= 1) {
                            dp[i][j] = true;
                            if (j - i > result) {
                                result = j - i;
                                str = s.substring(i, j + 1);
                            }
                        } else if (dp[i + 1][j - 1]) {
                            dp[i][j] = true;
                            if (j - i > result) {
                                result = j - i;
                                str = s.substring(i, j + 1);
                            }
                        }
                    }
                }
            }

            return str;
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}
